/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Sablony;

import java.util.Date;
import java.util.TreeSet;
import org.w3c.dom.*;

/**
 *
 * @author MartinaHlinková
 */
public class Zamestnanec implements Comparable<Zamestnanec>{
     private int idZamestnanca;
     private String meno;
     private String priezvisko;
     private String titul;
     private Sablony.Pohlavie pohlavie;
     private Sablony.Funkcia funkcia;
     private Sablony.TypZamestnanca typZamestnanca;
     private Sablony.SiloveUlohy sila;
     private TreeSet<NepritomnostZamestnanca> nepritomnost;
    
    public Zamestnanec(int id, String meno, String priezvisko, String titul, Sablony.Funkcia funkcia,Sablony.Pohlavie pohlavie,Sablony.SiloveUlohy sila, Sablony.TypZamestnanca typ){
        this.idZamestnanca = id;
        this.meno = meno;
        this.priezvisko = priezvisko;
        this.titul = titul;
        this.funkcia = funkcia;
        this.pohlavie = pohlavie;
        this.sila = sila;
        this.typZamestnanca = typ;
        this.nepritomnost = new TreeSet<NepritomnostZamestnanca>();
    }

    public boolean pridajNepritomnost(InformacnaStruktura.Den den,InformacnaStruktura.CasBezDatumu zaciatok,InformacnaStruktura.CasBezDatumu koniec){
        if(zaciatok == null || koniec == null || den == null) return false;
        Sablony.NepritomnostZamestnanca novaNepritomnost = new NepritomnostZamestnanca(den,zaciatok, koniec);
        if(novaNepritomnost.skontrolujSpravnost() == false) return false;
        for(Sablony.NepritomnostZamestnanca iterator: this.nepritomnost){
            if(novaNepritomnost.majuRovnakeIntervaly(iterator) == true){
                return false;
            }
        }
        return this.nepritomnost.add(novaNepritomnost);
    }
    
    public boolean pridajNepritomnost(Sablony.NepritomnostZamestnanca novaNepritomnost){
        if(novaNepritomnost == null || novaNepritomnost.skontrolujSpravnost() == false) return false;
         for(Sablony.NepritomnostZamestnanca iterator: this.nepritomnost){
            if(novaNepritomnost.majuRovnakeIntervaly(iterator) == true) return false;
        }
        return this.nepritomnost.add(novaNepritomnost);
    }
    
     public boolean odoberNepritomnost(Sablony.NepritomnostZamestnanca datum){
        if(datum == null)return false;
        return this.nepritomnost.remove(datum);
    }
    
    public Sablony.NepritomnostZamestnanca najdiNepritomnostPodlaDna(String pociatocnyCas){
        if(pociatocnyCas == null) return null;
        
        for(Sablony.NepritomnostZamestnanca iterator:this.nepritomnost){
            String hladanie = iterator.getDenNepritomnosti().toString();
            if(hladanie.equals(pociatocnyCas)){
                return iterator;
            }
        }
        return null;
    }
     
    @Override
    public int compareTo(Zamestnanec o) {
       // if(this.getFunkciaZamestnanca().compareTo(o.getFunkciaZamestnanca())< 0)return -1;
       // if(this.getFunkciaZamestnanca().compareTo(o.getFunkciaZamestnanca())> 0)return +1;
        if(this.getIDZamestnanca() > o.getIDZamestnanca()){
            return (+1);
        }
        if(this.getIDZamestnanca() < o.getIDZamestnanca()){
            return (-1);
        }
        return 0;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + this.idZamestnanca;
        return hash;
    }
     public boolean equals(Object o){
        if(o == this){
            return true;
        }
        if(o instanceof Zamestnanec == false){
            return false;
        }
        boolean rovnake = (this.idZamestnanca == ((Zamestnanec) o).getIDZamestnanca());
        return rovnake;
    }
     
    public int getIDZamestnanca(){
        return this.idZamestnanca;
    }
    
    public String getMenoZamestnanca(){
        return this.meno;
    }
    
    public String getPriezviskoZamestnanca(){
        return this.priezvisko;
    }
    
    public Sablony.Funkcia getFunkciaZamestnanca(){
        return this.funkcia;
    }
    
    public Sablony.Pohlavie getPohlavieZamestnanca(){
        return this.pohlavie;
    }
    
    public Sablony.SiloveUlohy getSilaZamestnanca(){
        return this.sila;
    }
    
    public Sablony.TypZamestnanca getTypZamestnanca(){
        return this.typZamestnanca;
    }
    
    public String getTitulZamestnanca(){
        return this.titul;
    }
    
    public TreeSet<NepritomnostZamestnanca> getNepritomnost(){
        return this.nepritomnost;
    }
    
    public String[] zamestnanecToArray(){
        String[] zamestnanecArray = new String[8];
        zamestnanecArray[0] = Integer.toString(this.getIDZamestnanca());
        if(this.getTitulZamestnanca() == null){
            zamestnanecArray[1] = "";
        }else{
            zamestnanecArray[1] = this.getTitulZamestnanca();
        }
        zamestnanecArray[2] = this.getMenoZamestnanca();
        zamestnanecArray[3] = this.getPriezviskoZamestnanca();
        zamestnanecArray[4] = this.getFunkciaZamestnanca().toString();
        zamestnanecArray[5] = this.getPohlavieZamestnanca().toString();
        zamestnanecArray[6] = this.getSilaZamestnanca().toString();
        zamestnanecArray[7] = this.getTypZamestnanca().toString();
        return zamestnanecArray;
    }
    
    @Override
    public String toString(){
        return ""+this.idZamestnanca+this.meno;
    }
    
    public static Zamestnanec nacitajZamestnanca(Element eElement){
        if(eElement == null)return null;
        
        int id = Integer.parseInt(eElement.getAttribute("id"));
        String menoZ = eElement.getElementsByTagName("meno").item(0).getTextContent();
        String priezviskoZ = eElement.getElementsByTagName("priezvisko").item(0).getTextContent();
        String titulZ = eElement.getElementsByTagName("titul").item(0).getTextContent();
                        
       String funkciaZ = eElement.getAttribute("funkcia");
       Sablony.Funkcia funkcia = null;
       final Sablony.Funkcia[] funkcie = Sablony.Funkcia.values();
       for(Sablony.Funkcia iterator: funkcie){
            if(iterator.toString().equals(funkciaZ)){
                 funkcia = iterator;
            }
       }
                        
      String pohlavieZ = eElement.getAttribute("pohlavie");
      Sablony.Pohlavie pohlavie = null;
      final Sablony.Pohlavie[] pohlavia = Sablony.Pohlavie.values();
      for(Sablony.Pohlavie iterator: pohlavia){
            if(iterator.toString().equals(pohlavieZ)){
                 pohlavie = iterator;
            }
      }
                        
      String silaZ = eElement.getAttribute("sila");
      Sablony.SiloveUlohy sila = null;
      final Sablony.SiloveUlohy[] sily = Sablony.SiloveUlohy.values();
      for(Sablony.SiloveUlohy iterator: sily){
            if(iterator.toString().equals(silaZ)){
                 sila = iterator;
            }
      }
                        
      String typZ = eElement.getAttribute("typZamestnanca");
      Sablony.TypZamestnanca typ = null;
      final Sablony.TypZamestnanca[] typy = Sablony.TypZamestnanca.values();
      for(Sablony.TypZamestnanca iterator: typy){
            if(iterator.toString().equals(typZ)){
                typ = iterator;
            }
      }
      
      Sablony.Zamestnanec nacitanyZamestnanec = new Zamestnanec(id,menoZ,priezviskoZ,titulZ,funkcia,pohlavie,sila,typ);
      NodeList listNepritomnosti = eElement.getElementsByTagName("nepritomnost");// uzly nepritomnosti zamestnanca
                        
      for (int j = 0; j < listNepritomnosti.getLength(); j++) {// for pre kazdy uzol nepritomnosti
            InformacnaStruktura.Den den = null;
            InformacnaStruktura.CasBezDatumu casOd, casDo;
            Node nodeNepritomnost = listNepritomnosti.item(j);
                            
            if (nodeNepritomnost.getNodeType() == Node.ELEMENT_NODE) {
                Element eNepritomnost = (Element) nodeNepritomnost;
                                
                Node nodeOD = eNepritomnost.getElementsByTagName("OD").item(0);
                Node nodeDO = eNepritomnost.getElementsByTagName("DO").item(0);
                Node nodeDen = eNepritomnost.getElementsByTagName("den").item(0);
                                
                casOd = new InformacnaStruktura.CasBezDatumu(
                                        Integer.parseInt(((Element)nodeOD).getAttribute("hodina"))
                                        , Integer.parseInt(((Element)nodeOD).getAttribute("minuta")));
                casDo = new InformacnaStruktura.CasBezDatumu(
                                        Integer.parseInt(((Element)nodeDO).getAttribute("hodina"))
                                        , Integer.parseInt(((Element)nodeDO).getAttribute("minuta")));
                String denString = ((Element)nodeDen).getTextContent();
                final InformacnaStruktura.Den[] dni = InformacnaStruktura.Den.values();
                for(InformacnaStruktura.Den iterator: dni){
                    if(iterator.toString().equals(denString)){
                        den = iterator;
                    }
                }
                nacitanyZamestnanec.pridajNepritomnost(den,casOd, casDo);
            }
        }// for pre kazdy uzol nepritomnosti
        
        return nacitanyZamestnanec;
    }
    
    public Element zamestnanecToElement(Document doc){
        
        Element zamestnanec = doc.createElement("zamestnanec");
                    
                
                    Attr attrID = doc.createAttribute("id");
                    attrID.setValue(Integer.toString(this.getIDZamestnanca()));
                    zamestnanec.setAttributeNode(attrID);
                    
                    Attr attrPohlavie = doc.createAttribute("pohlavie");
                    attrPohlavie.setValue(this.getPohlavieZamestnanca().toString());
                    zamestnanec.setAttributeNode(attrPohlavie);
                    
                    Attr attrSila = doc.createAttribute("sila");
                    attrSila.setValue(this.getSilaZamestnanca().toString());
                    zamestnanec.setAttributeNode(attrSila);
                    
                    Attr attrTyp = doc.createAttribute("typZamestnanca");
                    attrTyp.setValue(this.getTypZamestnanca().toString());
                    zamestnanec.setAttributeNode(attrTyp);
                    
                    Attr attrFunkcia = doc.createAttribute("funkcia");
                    attrFunkcia.setValue(this.getFunkciaZamestnanca().toString());
                    zamestnanec.setAttributeNode(attrFunkcia);
                    
                    Element menoElement = doc.createElement("meno");
                    menoElement.appendChild(doc.createTextNode(this.getMenoZamestnanca()));
                    zamestnanec.appendChild(menoElement);
                    
                    Element priezviskoElement = doc.createElement("priezvisko");
                    priezviskoElement.appendChild(doc.createTextNode(this.getPriezviskoZamestnanca()));
                    zamestnanec.appendChild(priezviskoElement);
                    
                    Element titulElement = doc.createElement("titul");
                    titulElement.appendChild(doc.createTextNode(this.getTitulZamestnanca()));
                    zamestnanec.appendChild(titulElement);
                    
                    Element nepritomnosti = doc.createElement("NepritomnostZamestnanca");
                    
                    for(Sablony.NepritomnostZamestnanca iter:this.getNepritomnost()){
                        Element pritom = doc.createElement("nepritomnost");

                        Element casOd = doc.createElement("OD");
                            Attr hodinaOd = doc.createAttribute("hodina");
                            hodinaOd.setValue(""+iter.getCasOdkedy().getHodiny());
                            casOd.setAttributeNode(hodinaOd);
                            Attr minutaOd = doc.createAttribute("minuta");
                            minutaOd.setValue(""+iter.getCasOdkedy().getMinuty());
                            casOd.setAttributeNode(minutaOd);
                       pritom.appendChild(casOd);
                       
                       Element casDo = doc.createElement("DO");
                            Attr hodinaDo = doc.createAttribute("hodina");
                            hodinaDo.setValue(""+iter.getCasDokedy().getHodiny());
                            casDo.setAttributeNode(hodinaDo);
                            Attr minutaDo = doc.createAttribute("minuta");
                            minutaDo.setValue(""+iter.getCasDokedy().getMinuty());
                            casDo.setAttributeNode(minutaDo);
                       pritom.appendChild(casDo);
                       
                       Element den = doc.createElement("den");
                           den.appendChild(doc.createTextNode(iter.getDenNepritomnosti().toString()));
                       pritom.appendChild(den);  
                       nepritomnosti.appendChild(pritom);
                    }
                    zamestnanec.appendChild(nepritomnosti);
        
        return zamestnanec;
    }
    
}
